package com.atguigu.interview.study.juc;

import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;
import sun.java2d.pipe.OutlineTextRenderer;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;

/**
 * @author gcq
 * @Create 2020-12-07
 */
public class AQSDemo {
    public static void main(String[] args) {

        ReentrantLock lock = new ReentrantLock();

        // 带入一个银行办理业务的案例来模拟我们的AQS如何进行线程的管理和通知唤醒机制

        // 3个线程模拟3个来银行网点，受理窗口办理业务的顾客

        // A 顾客就是第一个顾客，此时窗口没有任何人，A可以直接去办理
        new Thread(() -> {
            lock.lock();
            try {
                System.out.println("----------A thread come in");
                // 暂停一会线程
                try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
            }
        },"A").start();

        // 第二个顾客 第2个线程 -->由于受理业务的窗口只能有一个（只能有一个线程持有锁），此时B等待
        // 进入候客区
        new Thread(() -> {
            lock.lock();
            try {
                System.out.println("----------B thread come in");
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
            }
        },"A").start();


        // 第三个顾客 第三个线程 -->由于受理业务的窗口只能有一个（只能有一个线程持有锁），此时C等待
        // 进入候客区
        new Thread(() -> {
            lock.lock();
            try {
                System.out.println("----------C thread come in");
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
            }
        },"A").start();
    }
}